/**
 * 
 */
package cn.biplam.back.sql.select;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Map;

import cn.biplam.common.paramters.SelectConstant.Operator_Rela;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;

/**
 * 简单的Select模型(单表Select,多字段、多过滤条件)
 * @author 	WangSong 2009-10-31 下午02:42:38
 * @version 1.0
 */
public class BaseSelect implements Serializable {
	
	private static final long serialVersionUID = -1;
	String tableName;
	ArrayList<String> fields;
	KvMap<String, String> filters;
	
	public BaseSelect(String tableName){
		this.tableName=tableName;
		this.fields=new ArrayList<String>();
		this.filters=new KvMap<String, String>();
	}
	
	/**
	 * 放入一个字段
	 * @param fieldName	字段名
	 */
	public void putField(String fieldName){
		this.fields.add(fieldName);
	}
	
	/**
	 * 放入一个字符类型过滤条件
	 * @param filterFieldName	过滤字段名
	 * @param filterValue		过滤值(字符型数据,不带单引号)
	 * @throws ErrorMessage
	 */
	public void putStringFilter(String filterFieldName,String filterValue) throws ErrorMessage{
		this.putStringFilter(filterFieldName, filterValue, null);
	}
	
	/**
	 * 放入一个字符类型过滤条件
	 * @param filterFieldName	过滤字段名
	 * @param filterValue		过滤值(字符型数据,不带单引号)
	 * @param rela 比较符常量
	 * @throws ErrorMessage
	 */
	public void putStringFilter(String filterFieldName,String filterValue,Operator_Rela rela) throws ErrorMessage{
		this.filters.put(filterFieldName, "'"+filterValue+"'");
	}
	
	/**
	 * 放入一个数字类型过滤条件
	 * @param filterFieldName	过滤字段名
	 * @param filterValue		过滤值(int型)
	 * @param rela 比较符常量
	 * @throws ErrorMessage
	 */
	public void putNumberFilter(String filterFieldName,int filterValue,Operator_Rela rela) throws ErrorMessage{
		this.filters.put(filterFieldName, String.valueOf(filterValue));
	}
	
	/**
	 * 放入一个数字类型过滤条件(带有单引号的字符型过滤条件也可使用本方法)
	 * @param filterFieldName	过滤字段名
	 * @param filterValue		过滤值(String型)
	 * @throws ErrorMessage
	 */
	public void putNumberFilter(String filterFieldName,String filterValue) throws ErrorMessage{
		this.filters.put(filterFieldName, filterValue);
	}
	
	/**
	 * 返回标准sql表达式
	 * @return String
	 */
	@Override
	public String toString(){
		StringBuilder sb = new StringBuilder();
		sb.append("select ");
		for(int i=0;i<this.fields.size();i++){
			if(i>0){
				sb.append(',');
			}
			sb.append(this.fields.get(i));
		}
		sb.append(" from ");
		sb.append(tableName);
		if(this.filters.size()>0){
			sb.append(" where ");
			int i=0;
			for(Map.Entry<String, String>ite:this.filters){
				sb.append(ite.getKey());
				sb.append("=");
				sb.append(ite.getValue());
				i++;
				if(i<this.filters.size()){
					sb.append(',');
				}
			}
		}
		return sb.toString();
		
	}

}
